package com.zw.pdm.module.file.service;

import com.zw.pdm.constant.Constant;
import com.zw.pdm.entity.basic.Verify;
import com.zw.pdm.entity.production.FilePlan;
import com.zw.pdm.entity.production.FileSheet;
import com.zw.pdm.entity.rep.VerifyProcess;
import com.zw.pdm.module.basic.mapper.OrgMapper;
import com.zw.pdm.module.basic.mapper.VerifyMapper;
import com.zw.pdm.module.file.mapper.FileListMapper;
import com.zw.pdm.module.file.repository.FilePlanRepository;
import com.zw.pdm.module.file.repository.FileSheetRepository;
import com.zw.pdm.module.report.mapper.VerifyProcessMapper;
import com.zw.pdm.module.report.repository.VerifyProcessRepository;
import com.zw.pdm.module.system.service.LogService;
import com.zw.pdm.util.ShiroUtils;
import org.apache.shiro.util.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

import static com.zw.pdm.constant.Constant.STATUS_COMMIT;
import static com.zw.pdm.util.BeanUtil.copy;


/**
 * @author mayongfeng
 * @version 1.0.0
 * @ClassName ProductionSheetService.java
 * @Description TODO
 * @createTime 2020年10月06日 16:43:00
 */
@Service
@SuppressWarnings("all")
public class FileListService {

    @Autowired
    private FileListMapper fileListMapper;
    @Autowired
    private OrgMapper orgMapper;
    @Autowired
    private LogService logService;
    @Autowired
    private FileSheetRepository fileSheetRepository;
    @Autowired
    private VerifyProcessMapper verifyProcessMapper;
    @Autowired
    private FilePlanRepository filePlanRepository;
    @Autowired
    private VerifyMapper verifyMapper;
    @Autowired
    private VerifyProcessRepository verifyProcessRepository;

    /**
     * @Author mayongfeng
     * @Date 11:02 2020/12/14
     * @Description 加载存档清单待提交列表功能
     **/
    public List<FileSheet> getFileList(FileSheet fileSheet, Integer i) {
        //获得用户Id
        fileSheet.setPostUserId(ShiroUtils.getUserId());
        //获得用户账号
        fileSheet.setCreateCodeTwo(ShiroUtils.getLoginName());
        //判断管理部门数量
        if (i == 1) {
            return fileListMapper.findEqIdFileReportList(fileSheet);
        } else {
            return fileListMapper.findInIdFileReportList(fileSheet);
        }


    }

    /**
     * 查询管理部门数量
     */
    public Integer countOrgByUserId() {
        return orgMapper.countOrgByUserId(ShiroUtils.getUserId());
    }

    /**
     * @Author mayongfeng
     * @Date 13:06 2020/12/14
     * @Description 删除数据
     **/
    @Transactional(rollbackFor = Exception.class)
    public int delFileListOne(Integer id) {
        logService.saveLog("删除存档清单", "存档ID：" + id);
        /** 通过Id查询出主单的详情*/
        FileSheet fileSheet = fileSheetRepository.getOne(id);
        /** 在通过参数查询出有没有版本记录*/
        List<FileSheet> fileSheetList = fileSheetRepository.findByProCodeAndPartIdAndSpecialIdAndIsDelAndSheetTypeOrderByIdDesc(
                fileSheet.getProCode(), fileSheet.getPartId(), fileSheet.getSpecialId(), 0, 2);

        if (!CollectionUtils.isEmpty(fileSheetList)) {
            /** 获取最新的版本信息*/
            FileSheet fileSheetDesc = fileSheetList.get(0);
            /** 将最新的版本信息还原成原始单*/
            fileSheetDesc.setSheetType(1);
            fileSheetRepository.saveAndFlush(fileSheetDesc);
        }
        //通过Id修改明细表make_plan的此条数据的删除状态1=删除，0=默认正常
        fileListMapper.delFilePlanList(id, Constant.STATUS_NORMAL);
        //修改主表的删除状态
        return fileListMapper.delFileSheetList(id, Constant.STATUS_NORMAL);

    }

    /**
     * @Author mayongfeng
     * @Date 14:18 2020/12/14
     * @Description 通过id查询主表信息
     **/
    public FileSheet getfileListById(Integer sheetId) {
        return fileSheetRepository.getOne(sheetId);
    }

    /**
     * myf查询此制作件清单的所有审核流程
     */
    public List<VerifyProcess> findVpBySheetId(Integer sheetId) {
        return verifyProcessMapper.findVpFileBySheetId(sheetId);
    }

    /**
     * 查询
     */
    public List<FilePlan> findFilePlanBySheetId(Integer sheetId) {
        return filePlanRepository.findBySheetIdAndIsDel(sheetId, 0);
    }

    /**
     * 修改后的保存
     */
    public int fileEditSave(FileSheet fileSheet, Integer[] filePlanId, String[] fileName, Integer[] picecNum, Integer[] pageNum, String[] remark) {
        FileSheet target = fileSheetRepository.getOne(fileSheet.getId());
        target.setPostTel(fileSheet.getPostTel());
        target.setSpecial(fileSheet.getSpecial());
        target.setSpecialId(fileSheet.getSpecialId());
        target.setPart(fileSheet.getPart());
        target.setPartId(fileSheet.getPartId());
        fileSheetRepository.saveAndFlush(target);
        for (int i = 0; i < picecNum.length; i++) {
            FilePlan filePlan = filePlanRepository.getOne(filePlanId[i]);
            filePlan.setFileName(fileName[i]);
            filePlan.setPicecNum(picecNum[i]);
            filePlan.setPageNum(pageNum[i]);
            if (remark.length > 0) {
                filePlan.setRemark(remark[i]);
            }
            filePlanRepository.saveAndFlush(filePlan);
        }
        logService.saveLog("修改存档清单", "存档清单ID：" + fileSheet.getId());
        return 1;
    }

    /**
     * @Author mayongfeng
     * @Date 8:38 2020/12/15
     * @Description 在修改页面删除每条明细
     **/
    public int delFilePlan(Integer id) {
        FilePlan filePlan = filePlanRepository.getOne(id);
        filePlan.setIsDel(1);
        filePlanRepository.saveAndFlush(filePlan);
        logService.saveLog("删除存档清单明细", "ID：" + id);
        return 1;
    }

    /**
     * @Author mayongfeng
     * @Date 9:08 2020/12/15
     * @Description 提交存档清单
     **/
    @Transactional(rollbackFor = Exception.class)
    public int fileCommit(Integer id) {
        logService.saveLog("提交存档清单", "存档ID：" + id);
        FileSheet fileSheet = fileSheetRepository.getOne(id);
        //判断提交列表的提交状态1=未提交，2=已提交，3=被驳回，4=撤消，5=全部审核通过，
        if (fileSheet.getStatus() == STATUS_COMMIT) {
            return 1;
        }
        /** 查询是变更提交还是原始提交*/
        List<VerifyProcess> byFileSheetId = verifyProcessRepository.findByFileSheetId(id);
        /** 有数据是变更提交*/
        if (CollectionUtils.isEmpty(byFileSheetId)) {
            /** 查看审核配置*/
            Verify verify = new Verify();
            List<Verify> verifyList = verifyMapper.findFileSheetByCondition(verify);
            /** 生成审核记录*/
            for (int i = 0; i < verifyList.size(); i++) {
                //创建审核记录表的对象
                VerifyProcess vp = new VerifyProcess();
                //制作件表的主ID
                vp.setFileSheetId(fileSheet.getId());
                //审核的排序字段
                vp.setOrderNo(verifyList.get(i).getOrderNo());
                //是否最后审核 0=否， 1=是
                vp.setComp(verifyList.get(i).getComp());
                //判断是否是首次审核
                if (i == 0) {
                    /** 当前标记 0=非 1=是  */
                    vp.setCur(1);
                    /** 是否为起始审核 0=否 1=是 */
                    vp.setStart(1);
                } else {
                    vp.setCur(0);
                    vp.setStart(0);
                }
                /** 状态 0=被驳回，1=未审核，2=已审核 */
                vp.setStatus(1);
                /** 审核人ID */
                vp.setVerifier(verifyMapper.findVerifier(ShiroUtils.getUserId(), verifyList.get(i).getPost()));
                verifyProcessRepository.save(vp);
            }
        }

        //通过Id修改主表的status的状态为2=已提交
        return fileListMapper.updateFileSheetById(id, null, STATUS_COMMIT);
    }


    /**
     * @Author mayongfeng
     * @Date 20:35 2020/12/18
     * @Description 变更后的保存
     **/
    public int FileChangeSave(FileSheet ft, Integer[] filePlanId, String[] fileName, Integer[] picecNum,
                              Integer[] pageNum, String[] remark, Integer[] cacheDelId) {
        /** 变更的时候在主单里面添加一条新的记录*/
        FileSheet fileSheet = getFileSheet(ft);

        for (int i = 0; i < fileName.length; i++) {
            FilePlan filePlan = new FilePlan();
            filePlan.setFileName(fileName[i]);
            filePlan.setPicecNum(picecNum[i]);
            filePlan.setPageNum(pageNum[i]);
            if (remark.length > 0) {
                filePlan.setRemark(remark[i]);
            }
            filePlan.setSheetId(fileSheet.getId());
            filePlan.setIsDel(0);
            filePlan.setCreateTime(new Date());
            filePlanRepository.save(filePlan);

        }
        logService.saveLog("变更存档清单保存", "变更后的ID：" + fileSheet.getId() + "来源Id：" + ft.getId());
        return 1;

    }

    /**
     * 生成变更制作件请单主表
     */
    private FileSheet getFileSheet(FileSheet ft) {
        /** 通过页面传过来的Id查询出主表信息*/
        FileSheet fileSheet = fileSheetRepository.getOne(ft.getId());
        /** 修改原始为历史版本SheetType 1=原始单，2=历史版本*/
        fileSheet.setSheetType(2);
        /** 保存数据*/
        fileSheetRepository.saveAndFlush(fileSheet);

        /** new一个新的对象留保存变更的*/
        FileSheet target = new FileSheet();
        /** copy过程*/
        copy(fileSheet, target);
        /** 主Id为空添加到主表*/
        target.setId(null);
        /** 状态 1=未提交，2=已提交，3=被驳回，4=撤消，5=全部审核通过，6=已确认*/
        target.setStatus(1);
        /** 是否可以变更  0=否，1=是*/
        target.setMayChange(0);
        target.setSheetType(1);
        /** 制作件主表ID*/
        target.setSheetId(ft.getId());
        /** 提报人电话*/
        target.setPostTel(ft.getPostTel());
        /** 修改提报时间*/
        target.setCreateTime(new Date());
        /** 档案签收0=未签收*/
        target.setFileSignStatus(0);
        /** 下发状态0=未下发，1=已下发*/
        target.setDesignStatus(0);
        /** 下发时间*/
        target.setVerifyTime(null);
        /** 签收人*/
        target.setFileSigner(null);
        /** 签收时间时间*/
        target.setFileSigner(null);
        /** 签收备注*/
        target.setFileRemark(null);
        return fileSheetRepository.save(target);
    }

    /**
     * 查看历史版本记录
     */
    public List<FileSheet> getFileHistoryList(FileSheet fileSheet, Integer i) {
        //获得用户Id
        fileSheet.setPostUserId(ShiroUtils.getUserId());
        //获得用户账号
        fileSheet.setCreateCodeTwo(ShiroUtils.getLoginName());
        //判断管理部门数量
        if (i == 1) {
            return fileListMapper.findHistoryEqIdFileReportList(fileSheet);
        } else {
            return fileListMapper.findHisToryInIdFileReportList(fileSheet);
        }
    }
}
